iT邦幫忙

DAY 3
1

用程式描繪世界 - 閱讀The Nature of Code系列 第 3

[Day3] - 模擬隨機移動

  • 分享至 

  • xImage
  •  

這篇是The Nature fo Code的第0章-Introduction,想必內容也不會太艱澀,這章在描述物體的隨機移動,隨機運動可以應用在模擬空氣中的漂浮粒子,或是賭局的過程與結果。

怎麼樣隨機呢?想像你正在走路,但只有兩個方向可以選擇,不是前進就是後退,我們用擲硬幣來決定前進或後退,擲到正面就前進一步,反面則後退一步,這就是隨機運動。假如要往四個方向移動,便是擲兩次硬幣,

1 | 2 | 決定的動作
一 | 一 | 一
正 | 正 | 前進
正 | 負 | 後退
負 | 正 | 向右
負 | 負 | 向左

乍看之下不就是一個Random function就可以解決了嗎? 真的這麼簡單?的確是,但也不是,這章的主要目的有三個:

  1. 在Processing中如何用 "物件導向" 的設計方式,讓物體在螢幕上動起來。
  2. 嘗試找到某個現象的規則,并實作他。
  3. 在往後的章節中會需要一些關於隨機、機率與Perlin noise的基本知識,這裡會有些基本介紹

看完這張的內容之後發現,關於物件導向,從來沒有真的那麼接近過老師舉的例子,我真的有一個叫人的類別,它真的有一個行為叫走路,它真的會在螢幕上走路,真的很酷,所以我們不能跳過簡單的這一章。

The Random Walker Class

首先要建出一個Walker的物件,說明一下物件導向

物件Object
是一個擁有屬性以及方法的實體,在Walker物件上代表,會有一個屬性去記錄他在螢幕上的位置,另外會有方法去呈現Walker會做的行為,像是往某個方向走一步,或是把自己畫在螢幕上。

類別Class
類別是一個物件的藍圖,可以用來創造出物件的實體,用書裡的例子來講,類別是餅乾刀模(cookie cutter),物件則是真正的餅乾。

現在來定義一個Walker的class,他會需要兩個屬性,x坐標與y坐標,代表螢幕上的位置。

class Walker{
  int x;
  int y;

每個class也可以定義建構子(constructor),他會在物件被建立的時候執行,裡面可以放初始值或一開始要執行的動作,在這邊我們定義物件起始的位置。

Walker(){
  x = width/2;
  y = height/2;
}

再來是物件的行為,需要一個方法能夠把它自己畫在螢幕上,

void display(){
  stroke(0);
  point(x,y);
}

但畫在螢幕上還不會移動,因為x與y的值沒有被改變,需要一個移動位置的方法,前面提到我們要進行隨機移動可以擲硬幣決定,四個方向必須擲兩次,但在程式中我們可以使用random()這個方法,random(4),會產生介於0~3.99999999之間的浮點數(不會是4),因此如果小數點後捨去,int(random(4)),就可以得到整數的0、1、2、3四個結果,剛剛好四個方向。

void step() {
  int choice = int(random(4));

得到的結果對應四個方向的移動

  if(choice == 0){
    x++;
  }else if(choice == 1){
    x--;
  }else if(choice == 2){
    y++;
  }else{ //3
    y--
  }

我們已經有了一個完整的class,把Walker所有的行為都定義在裡面,現在要把它真正的畫到螢幕上,這會使用到在Processing基礎介紹到的setup()與draw(),

定義一個Walker形態的全域變數w,讓它可以同時在setup與draw中使用

Walker w;

設定螢幕大小與背景顏色,並創建Walker物件

void setup(){
  size(300, 300);
  background(255);
  w = new Walker();
}

在每次畫面更新的時候,walker便移動一步,並在螢幕上畫一個點

void draw(){
  w.step();
  w.display();
}

執行後的結果便是一個移動的小點,會不斷地在螢幕上留下軌跡,為什麼會留下軌跡呢?因為Processing不會在每次draw之後清空畫面,所以就會記錄每一次所繪的結果,也可以在draw裡面插入background(255),這樣就會跑出像是一隻螢火蟲(或蒼蠅)
飛來飛去的結果。

void draw(){
  background(255);
  w.step();
  w.draw();
}

完整程式碼可以在書本的Github Repo找到,這裡是本節程式碼

下一次要繼續介紹introduction的內容,大概會拆成三篇來寫,主要希望每篇的字數能控制在兩千字以內,比較容易理解與閱讀。

下一篇-改進Random Walker。


上一篇
[Day2] - Processing基本介紹
下一篇
[Day4] - 隨機移動與Uniform Distribution
系列文
用程式描繪世界 - 閱讀The Nature of Code9
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言